import java.util.ArrayList;

public class Jugador {

	private String nombre;
	private MazoCamino caminoActual;
	private Mazo mano;
	private int cantCasillas;
	private int cantCasillasInicial;
	private ArrayList<Ficha> fichas;
	private int numEtapa;
	private int puntos;
	private Personaje ayudante;
	
	//CONSTRUCTOR
	public Jugador(String nombre) {
		// setea el nombre del jugador
		this.nombre = nombre;

		// crea la lista de fichas vacia
		this.fichas = new ArrayList<Ficha>();

		//setea la cantidad de casillas iniciales en 0
		this.cantCasillas = 0;
		this.cantCasillasInicial = 0;

		// creacion de mazos vacios
		this.caminoActual = new MazoCamino();
		this.mano = new Mazo();

		// setea el numero de etapa a 0
		this.numEtapa = 0;

		// comienza con 0 puntos
		this.puntos = 0;
		
		//setea el ayudante a null
		this.ayudante = null;
	}
	
	// GETTERS
	public String getNombre() {
		return this.nombre;
	}

	public MazoCamino getCaminoActual() {
		return this.caminoActual;
	}

	public Mazo getMano() {
		return this.mano;
	}

	public int getCantCasillas() {
		return this.cantCasillas;
	}

	public int getCantCasillasInicial() {
		return this.cantCasillasInicial;
	}
	
	public int getCantCasillasUtilizadas(){
		return this.cantCasillasInicial - this.cantCasillas;
	}
	
	public ArrayList<Ficha> getFichas() {
		return this.fichas;
	}

	public int getNumEtapa() {
		return this.numEtapa;
	}

	public int getPuntos(){
		return this.puntos;
	}
	
	public Personaje getAyudante(){
		return this.ayudante;
	}
	
	//SETTERS
	public void setCantCasillas(int cantCasillas){
		this.cantCasillas = cantCasillas;
		this.cantCasillasInicial = cantCasillas;
	}
	
	public void setAyudante(Personaje ayudante){
		this.ayudante = ayudante;
	}
	
	// METODOS
	//devuelve una casilla del jugador que crea en el momento y resta en 1 el contador
	public Casilla usarCasilla(){
		this.cantCasillas--;
		return new Casilla(this);
	}
	
	// agrega una ficha a la lista de fichas del jugador y suma los puntos
	public void agregarFicha(Ficha fichaGanada) {
		this.fichas.add(fichaGanada);
		this.puntos += fichaGanada.getValor();
	}
	
	// avanza de etapa dentro del turno al jugador
	public void siguienteEtapa() {
		this.numEtapa++;

		if (this.numEtapa > 3) {
			this.numEtapa = 0;
		}
	}
	
	//cierra el turno a 0
	public void cerrarTurno() {
		this.numEtapa = 0;
		this.ayudante = null;
	}
	
	//agrega una carta a la mano
	public void levantarCarta(Carta c) {
		this.mano.agregarCarta(c);
	}
	
	//agrega una carta al camino
	public void agregarAlCamino(Carta c, boolean inicio){
		if(inicio){
			this.caminoActual.agregarAlInicio(c);
		}else{
			this.caminoActual.agregarAlFinal(c);
		}		
	}
	
	//metodo que verifica si ya tiene una ficha del mismo tipo
	public boolean contieneFicha(Ficha fichaAgregada){
		for(Ficha f : this.fichas){
			if(f.getTipo() == fichaAgregada.getTipo()){
				switch(f.getTipo()){
					//ficha tipo fin
					case 'f': return true;
					
					//ficha tipo total regiones
					case 't': return true;
					
					//ficha tipo longitud
					case 'l':
						FichaLongitud fLong = (FichaLongitud)f;
						FichaLongitud fLongAgregada = (FichaLongitud)fichaAgregada;
						if(fLong.getLongitud() == fLongAgregada.getLongitud()){
							return true;
						}
					
					//ficha tipo regiones
					case 'r': 
						FichaRegiones fReg = (FichaRegiones)f;
						FichaRegiones fRegAgregada = (FichaRegiones)fichaAgregada;
						if(fReg.getRegion() == fRegAgregada.getRegion()){
							return true;
						}
							
					default: return false;
				}				
			}
		}
		
		return false;
	}
	
}
